#ifndef __POSITION_H
#define __POSITION_H


#include "stdint.h"


/* ====================== 自定义常量 =========================== */

extern volatile uint32_t gPositionPID_TimeCNT;


/* ===================== 自定义结构体 ========================== */

/*
	位置式PID调节（位置/角度环）
*/
typedef struct
{
	/* data */
    float kp;           // 比例
    float ki;           // 积分
    float kd;           // 微分
	
    float pre;          // 实际
    float tar;          // 目标
    float bias;         // 目标与实际之前差值（目标-实际）
    float lastBias;		// 上次差值
    float out;          // 输出
    float outMax;       // 输出限幅
	float err;          // 累计差值
	float cycle;		// 周期，单位秒
	
}POPID_Struct;	// position struct
typedef POPID_Struct *PPOPID_Struct;


/*
	电机位置控制结构体
*/
typedef struct
{
    uint8_t 		isEnable;	// 使能
    uint32_t 		sysTimer;	// 系统时钟
    POPID_Struct 	pPID;		// PID
    float (*GetPosition)(void);			// 获取电机实际位置
    void(*SetMotorSpeed)(float speed);	// 设置电机输出速度
	
}POSITION_Control_Struct;
typedef POSITION_Control_Struct *PPOSITION_Control_Struct;


/* ======================= 对外接口 ============================ */

void POSITION_PID_TIMEBASE(uint16_t ms);
uint32_t POSITION_PID_GETTIME(void);
uint8_t POSITION_PID_TIMEOUT(float timeOut, float startTime);

void PositionPIDCycle(PPOSITION_Control_Struct pPositionPID);
void SetPositionPIDParams(PPOSITION_Control_Struct pPositionPID, float kp, float ki, float kd);
void SetPositionPIDTar(PPOSITION_Control_Struct pPositionPID, float tar);
void SetPositionPIDEnable(PPOSITION_Control_Struct pPositionPID, float isEnable);
void PositionPIDPrintf(PPOSITION_Control_Struct pPositionPID);
		
	

#endif /* __POSITION_H */






